package com.code.leetcode._202504;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;

/**有效的括号**/
public class ValidKuoHao {

    HashMap<Character, Character> map = new HashMap<Character, Character>(){{
        put(']', '[');
        put('}', '{');
        put(')', '(');
    }};
    public boolean isValid(String s) {
        Deque<Character> d = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '{' || c == '[') {
                d.addLast(c);
            } else {
                if (!d.isEmpty() && d.peekLast() == map.get(c)) {
                    d.pollLast();
                } else {
                    return false;
                }
            }
        }
        return d.isEmpty();
    }
    /**我们也可以利用 "()"、"{}" 和 "[]" 的左右部分在 ASCII 值上比较接近的事实。

     ( 和 ) 分别对应 -7 和 -8；[ 和 ] 分别对应 43 和 45；{ 和 } 分别对应 75 和 77。

     也就是同类型的左右括号，相差不超过 2 ，同时不同类型的左右括号，相差大于 2。**/

    public boolean isValid1(String s) {
        Deque<Integer> d = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            int u = c - '0';
            if (c == '(' || c == '{' || c == '[') {
                d.addLast(u);
            } else {
                if (!d.isEmpty() && Math.abs(d.peekLast() - u) <= 2) {
                    d.pollLast();
                } else {
                    return false;
                }
            }
        }
        return d.isEmpty();
    }
}
